perm filename TMATCH.124[AID,LSP] blob sn#659283 filedate 1982-05-19 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	 2 Way Matcher
C00010 ENDMK
C⊗;
;;; 2 Way Matcher
;;; Here are the macros which define the simple tree structure case

(DECLARE (SETQ DEFMACRO-FOR-COMPILING ()) (MAPEX T)
	 (FASLOAD STRUCT FAS DSK (MAC LSP)))

(DEFMACRO CONSP (X) `(EQ (TYPEP ,X) 'LIST))

(DEFMACRO P-ATOMIC (X) `(ATOM ,X))

(DEFMACRO P-UNDECOMPOSABLE (X)
	  `(OR (ATOM ,X) 
	       (HUNKP ,X)))

(DEFMACRO P-CURRENT (X) `(CAR ,X))

(DEFMACRO P-ADVANCE (X) `(CDR ,X))

(DEFMACRO P-VAR-TYPE (ATOM) 
	  ;; returns the 1st character of an atom.
	  `(COND ((EQ (TYPEP ,ATOM) 'SYMBOL) (GETCHAR ,ATOM 1.))))

(DEFMACRO P-CHANGE-CURRENT (X Y) `(CONS ,Y (CDR ,X)))

(DEFMACRO P-CHANGE (X Y) Y)

(DEFMACRO P-RESTRICT-VAR (X) `(CADR ,X))

(DEFUN P-MAP-BUILD (FUN LIST)
       (COND ((NULL LIST) ())
	     (T (CONS (FUNCALL FUN (CAR LIST))
		      (P-MAP-BUILD FUN (CDR LIST))))))

(DEFMACRO P-CURRENT-EMPTY (X) `(NULL (CAR ,X)))

(DEFMACRO P-EMPTY (X) `(NULL ,X))

(DEFMACRO P-LISTIFY (X) X)

(DEFMACRO P-LISTIFY-REST (X) `(CDR ,X))

(DEFMACRO P-RESTRICT-FUNS (X) `(CDDR ,X))

(DEFMACRO P-RESTRICTP (%/#X) `(AND (NOT (ATOM ,%/#X))
				   (MEMQ (CAR ,%/#X) 
					 '($R RESTRICT ⊗R $IR IRESTRICT ⊗IR))))

(DEFMACRO P-IRESTRICTP (%/#X) `(AND (NOT (ATOM ,%/#X))
				   (MEMQ (CAR ,%/#X) 
					 '($IR IRESTRICT ⊗IR))))

(DEFMACRO P-FRESTRICTP (%/#X) `(AND (NOT (ATOM ,%/#X))
				   (MEMQ (CAR ,%/#X) 
					 '($R RESTRICT ⊗R))))

(DEFMACRO P-RESTRICT-VAR (X) `(CADR ,X))

(DEFMACRO P-RESTRICT-TYPE (X) `(CAR ,X))

(DEFMACRO P-CREATE-RESTRICTION (X Y Z)
	  `(CONS ,X (CONS ,Y  ,Z)))

(DEFMACRO P-ADD-ITEM (X ITEMS)
	  `(CONS ,ITEMS ,X))

(DEFMACRO P-ADD-ITEMS (X ITEMS)
	  `(APPEND ,ITEMS ,X))

(DEFMACRO P-REST-EMPTY (X) `(NULL (CDR ,X)))

(DEFMACRO P-CREATE-STATE (X) X)

(DEFMACRO P-CHANGE-CURRENT-ITEMS (X ITEMS)
	  `(APPEND ,ITEMS (CDR ,X)))

(DEFMACRO P-CREATE-NULL-STATE () ())

(DEFMACRO P-CREATE-STATE-FROM-CURRENT (X) `(CAR ,X))

(DEFMACRO P-CURRENT-ATOMIC (X) `(ATOM (CAR ,X)))

(DECLARE (SPECIAL -SEENR- -SEEN-))

(DEFUN P-CHECK (L)
  ((LAMBDA (-SEEN- -SEENR-)
    (P-CHECK1 L)) ()())) 

(DEFUN P-CHECK1 (L)
 (COND ((MEMQ L -SEENR-) (P-CURRENT L))
       ((P-UNDECOMPOSABLE L) (PUSH (P-CURRENT-OBJECT L) -SEENR-)
			     (PUSH L -SEENR-)
			     (P-CURRENT-OBJECT L))
       ((P-ATOMIC L) (P-CURRENT-OBJECT L))
       ((AND (CONSP (P-CURRENT L))
	     (EQ (P-CURRENT L) '-SPECIAL-FORM-))
	(P-ADVANCE L))
       (T 
	(LET ((X (P-MAP-BUILD #'P-CHECK1 L)))
	     (PUSH L -SEENR-)
	     (PUSH X -SEEN-) X)))) 

(EVAL-WHEN (COMPILE EVAL)
	   (DEFSTRUCT CHOOSER PAST-CHOICES ORIGINAL-DATA VARIABLE PREDICATES CHOICE EMPTY
		      SEARCH-LIST
		      CONSTANTP))

(DEFMACRO P-CHOOSEP (X) `(AND (NOT (ATOM ,X))
			      (MEMQ (CAR ,X) '($CHOOSE $CH))))

(DEFMACRO P-CHOOSE-VAR (X) `(CADR ,X))

(DEFMACRO P-EMPTY-CHOICE (X) `(EMPTY ,X))

(DEFMACRO COPY (X) `(MAPCAR #'(LAMBDA (X) X) ,X))

(DEFUN P-CHOOSE-FIRST (P D)
       (P-CHOOSER
	(MAKE-CHOOSER PAST-CHOICES () ORIGINAL-DATA D
		      CONSTANTP (ATOM P)
		      SEARCH-LIST D
		      CHOICE ()
		      EMPTY ()
		      VARIABLE (COND ((ATOM P) P)
				     (T (CADR P)))
		      PREDICATES (COND ((ATOM P) ())
				       (T (CDDR P))))))

(DEFUN P-CHOOSE-NEXT (OLD-CHOOSER)
       (P-CHOOSER
       (MAKE-CHOOSER
	PAST-CHOICES (PAST-CHOICES OLD-CHOOSER) 
	ORIGINAL-DATA (ORIGINAL-DATA OLD-CHOOSER)
	CONSTANTP (CONSTANTP OLD-CHOOSER)
	SEARCH-LIST (SEARCH-LIST OLD-CHOOSER)
	CHOICE ()
	EMPTY ()
	VARIABLE (VARIABLE OLD-CHOOSER)
	PREDICATES (PREDICATES OLD-CHOOSER))))

(DEFMACRO P-NEXT-CHOICE (X) `(CHOICE ,X))

(DEFUN P-CHOOSER (CHOOSER)
 (LET ((P (VARIABLE CHOOSER))
       (D (COPY (ORIGINAL-DATA CHOOSER)))
       (SL (COPY (SEARCH-LIST CHOOSER))))
      (LET ((CH ()))
	   (COND ((CONSTANTP CHOOSER)
		  (COND ((SETQ SL (MEMQ P SL))
			 (SETQ CH `(,P . ,(DELQ P D))) 
			 (COND ((MEMBER CH (PAST-CHOICES CHOOSER))
				(SETF (EMPTY CHOOSER) T))
			       (T (SETF (CHOICE CHOOSER) CH)
				  (SETF (SEARCH-LIST CHOOSER) (CDR SL))
				  (SETF (PAST-CHOICES CHOOSER)
					`(,CH . ,(PAST-CHOICES CHOOSER))))))
			(T (SETF (EMPTY CHOOSER) T))))
		 (T (LET ((CAND (P-SEARCH (PREDICATES CHOOSER) SL)))
			 (COND (CAND
				(SETQ CH `(,(CAR CAND) 
					   . ,(DELQ (CAR CAND)
						      D)))
				(COND ((MEMBER CH (PAST-CHOICES CHOOSER))
				       (SETF (EMPTY CHOOSER) T)) 
				      (T (SETF (CHOICE CHOOSER) CH)
					 (SETF (SEARCH-LIST CHOOSER) (CDR CAND))
					 (SETF (PAST-CHOICES CHOOSER)
					       `(,CH . ,(PAST-CHOICES CHOOSER))))))
				     (T (SETF (EMPTY CHOOSER) T))))))))  
 CHOOSER)

(DEFUN P-SEARCH (PREDS L)
       (DO ((L L (CDR L)))
	   ((NULL L) ())
	   (COND ((APPLY 'AND
			 (MAPCAR #'(LAMBDA (F)
					   (FUNCALL F (CAR L)))
				 PREDS))
		  (RETURN L))))) 

(EVAL-WHEN (COMPILE EVAL)
	   (SSTATUS FEATURES SYMMETRIC)
	   (SSTATUS NOFEATURES TYPED)
	   (SSTATUS FEATURES NON-DETERMINISM))

(EVAL-WHEN (COMPILE EVAL)
	   (SETQ MATCH-PREFIX '%%
		 MATCH-NAME '%UMATCH))

(INCLUDE "GMATCH.125")